﻿namespace Deppton.Mobile.Gps
{
using System;

    public static class Utils
    {
        /// <summary>
        /// Truncates the specified double.
        /// </summary>
        /// <param name="value">The double to truncate.</param>
        /// <returns>The truncated double.</returns>
        public static double Truncate(this double value)
        {
            if (value >= 0)
            {
                return Math.Floor(value);
            }
            else
            {
                return Math.Ceiling(value);
            }
        }

        public static IntPtr LocalAlloc(int byteCount)
        {
            IntPtr ptr = Win32.LocalAlloc(Win32.LMEM_ZEROINIT, byteCount);
            if (ptr == IntPtr.Zero)
            {
                throw new OutOfMemoryException();
            }

            return ptr;
        }

        public static void LocalFree(IntPtr hMem)
        {
            IntPtr ptr = Win32.LocalFree(hMem);
            if (ptr != IntPtr.Zero)
            {
                throw new ArgumentException();
            }
        }
    }

    public class Win32
    {
        public const int LMEM_ZEROINIT = 0x40;
        [System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint = "#33", SetLastError = true)]
        public static extern IntPtr LocalAlloc(int flags, int byteCount);

        [System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint = "#36", SetLastError = true)]
        public static extern IntPtr LocalFree(IntPtr hMem);
    }
}
